/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Commons;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;

/**Questa classe implementa il workflow. Al suo interno sono presenti due attributi
 * che ne definiscono l'id e la lista di taskdescriptor che il workflow contiene.
 *
 * @author Team5
 */
public class Workflow implements Serializable{

    //Attributes
    private ArrayList<TaskDescriptor> tasks;
    private int ID;

    /**STEP 2:
     * Campo necessario per trasferire le informazioni del vectorClock
     * necessarie per la gestione dell'ordinamento del logging globale
     */
    private HashMap<Integer,Integer> vectorClock;

    //Operations

    /**Metodo costruttore della classe.
     *
     */
    public Workflow(){ 
    tasks=new ArrayList<TaskDescriptor>();
    ID= (int) (1000*Math.random());
    //STEP2:
    //this.vectorClock= new HashMap<Integer,Integer>();
    }

    /**Metodo costruttore della classe con id specifico
     *
     * @param id l'id del workflow
     */
    public Workflow(int id){
    tasks=new ArrayList<TaskDescriptor>();
    ID= id;
    //STEP2:
    this.vectorClock= new HashMap<Integer,Integer>();
    }

    /**Metodo costruttore della classe completo di tutti i parametri
     *
     * @param tasks l'elenco dei taskdescriptor da inserire nel workflow
     * @param ID l'id del workdescriptor
     */
    public Workflow(ArrayList<TaskDescriptor> tasks, int ID){
    this.tasks=tasks;
    this.ID= ID;
    //STEP2:
    this.vectorClock= new HashMap<Integer,Integer>();
    
    }

    /**Questo metodo restituisce una lista di TaskDescriptor
     *
     * @return Lista di Tasks
     */
    public ArrayList<TaskDescriptor> getTasks(){
        return this.tasks;
    }

    /**Questo metodo permette di impostare la lista di taskdescriptor
     *
     * @param val la lista dei taskdescriptor
     */
    public void setTasks(ArrayList<TaskDescriptor> val){
        this.tasks=val;
    }

    /**Questo metodo permette di aggiungere un taskdescriptor alla lista
     *
     * @param ts il taskdescriptor da aggiungere
     */
    public int addTask(TaskDescriptor ts){
        System.out.println("Workflow:AddTask("+ts.getID()+")");
        tasks.add(ts);
        return tasks.size();
    }

    /**Questo metodo restituisce il taskdescriptor i-esimo presente nella lista
     * 
     * @param i la posizione del taskdescriptor nella lista
     * @return il taskdescriptor restituito
     */
    public TaskDescriptor getTask(int i){
        return this.tasks.get(i);
    }

    /**Questo metodo restituisce l'id del workflow
     *
     * @return l'id restituito
     */
    public int getID(){
        return this.ID;
    }

    /**Questo metodo permette di impostare il valore dell'ID del workflow
     * 
     * @param val l'id del workflow
     */
    public void setID(int val){
        this.ID=val;
    }

     /**Override del metodo toString() della classe Object
     *
     * @return la stringa contenente l'id del workflow
     */
    @Override
    public String toString(){
        return ""+ID;
    }



    /**STEP 2:
     * Fa parte dei metodi necessari per trasferire le informazioni del vectorClock necessarie per la gestione dell'ordinamento del logging globale.
     * @return vectorClock proveniente dall'entità precedente.
     */
    public HashMap<Integer,Integer> getVectorClock(){
        return this.vectorClock;
   }

    /**STEP 2:
     * Fa parte dei metodi necessari per trasferire le informazioni del vectorClock necessarie per la gestione dell'ordinamento del logging globale.
     * @param vectorClock 
     */
    public void setVectorClock(HashMap<Integer,Integer> vectorClock){
        this.vectorClock=vectorClock;

   }


}
